home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / ISSUE02 / CONSTRUC / TTT4.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1995-04-02  |  6.2 KB  |  207 lines

  1. unit TTT4;
  2. interface
  3. uses SysUtils, Classes, Controls, StdCtrls, Dialogs, Magic;
  4.  
  5. Type
  6.   TTTTControl4 = class(TWinControl)
  7.                  protected
  8.                    constructor Create(AOwner: TComponent); override;
  9.                    destructor Destroy; override;
  10.                    procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
  11.  
  12.                  private { Magic DLL handle }
  13.                    Game: HGame;
  14.  
  15.                  private { 9 game buttons }
  16.                    Button: Array[TPlace] of TButton;
  17.                    procedure ButtonClick(Sender: TObject);
  18.                    procedure ComputerMove;
  19.                    procedure UserMove(Move: TPlace);
  20.  
  21.                  private { start button }
  22.                    StartButton: TButton;
  23.                    procedure StartButtonClick(Sender: TObject);
  24.  
  25.                  private { game properties }
  26.                    FGameEnded: Boolean;
  27.                    FUserChar: Char;
  28.                    FCompChar: Char;
  29.  
  30.                  protected { design interface }
  31.                    procedure SetUserChar(Value: Char);
  32.                    procedure SetCompChar(Value: Char);
  33.  
  34.                  published { user interface }
  35.                    property GameEnded: Boolean read FGameEnded default False;
  36.                    property UserChar: Char read FUserChar write SetUserChar default 'X';
  37.                    property CompChar: Char read FCompChar write SetCompChar default '0';
  38.                  end {TTTTControl4};
  39.  
  40.   procedure Register;
  41.  
  42. implementation
  43.  
  44.   constructor TTTTControl4.Create(AOwner: TComponent);
  45.   var ButtonIndex: TPlace;
  46.   begin
  47.     inherited Create(AOwner);
  48.     Game := 0;
  49.     FGameEnded := True;
  50.     FUserChar := 'X';
  51.     FCompChar := '0';
  52.  
  53.     StartButton := TButton.Create(Self);
  54.     StartButton.Parent := Self;
  55.     StartButton.Visible := True;
  56.     StartButton.Caption := 'Humor me...';
  57.     StartButton.OnClick := StartButtonClick;
  58.  
  59.     for ButtonIndex := Low(ButtonIndex) to High(ButtonIndex) do
  60.     begin
  61.       Button[ButtonIndex] := TButton.Create(Self);
  62.       Button[ButtonIndex].Parent := Self;
  63.       Button[ButtonIndex].Caption := '';
  64.       Button[ButtonIndex].Visible := False;
  65.       Button[ButtonIndex].OnClick := ButtonClick;
  66.     end;
  67.     SetBounds(Left,Top,132,132)
  68.   end {Create};
  69.  
  70.   destructor TTTTControl4.Destroy;
  71.   var ButtonIndex: TPlace;
  72.   begin
  73.     if (Game > 0) then EndGame(Game);
  74.     StartButton.Destroy;
  75.     for ButtonIndex := Low(ButtonIndex) to High(ButtonIndex) do
  76.       Button[ButtonIndex].Destroy;
  77.     inherited Destroy
  78.   end {Destroy};
  79.  
  80.  
  81.   procedure TTTTControl4.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
  82.   Const Grid = 3;
  83.         GridX = 2;
  84.         GridY = 2;
  85.   var X,DX,W,Y,DY,H: Word;
  86.   begin
  87.     Inherited SetBounds(ALeft,ATop,AWidth,AHeight);
  88.     StartButton.SetBounds(0,0,Width,Height);
  89.     X := GridX;
  90.     DX := (Width div (Grid * (GridX+GridX))) * (GridX+GridX);
  91.     W := DX - GridX;
  92.     Y := GridY;
  93.     DY := (Height div (Grid * (GridY+GridY))) * (GridY+GridY);
  94.     H := DY - GridY;
  95.     Button[8].SetBounds(X, Y, W,H);
  96.     Button[1].SetBounds(X, Y+DY, W,H);
  97.     Button[6].SetBounds(X, Y+DY+DY, W,H);
  98.     Inc(X,DX);
  99.     Button[3].SetBounds(X, Y, W,H);
  100.     Button[5].SetBounds(X, Y+DY, W,H);
  101.     Button[7].SetBounds(X, Y+DY+DY, W,H);
  102.     Inc(X,DX);
  103.     Button[4].SetBounds(X, Y, W,H);
  104.     Button[9].SetBounds(X, Y+DY, W,H);
  105.     Button[2].SetBounds(X, Y+DY+DY, W,H)
  106.   end {SetBounds};
  107.  
  108.  
  109.   procedure TTTTControl4.StartButtonClick(Sender: TObject);
  110.   var ButtonIndex: TPlace;
  111.   begin
  112.     if MagicLoaded then
  113.     begin
  114.       Game := NewGame;
  115.       FGameEnded := False;
  116.       StartButton.Visible := False;
  117.       for ButtonIndex := Low(ButtonIndex) to High(ButtonIndex) do
  118.         Button[ButtonIndex].Visible := True;
  119.       ComputerMove
  120.     end
  121.     else
  122.       MessageDlg('Error loading MAGIC.DLL...', mtInformation, [mbOk], 0)
  123.   end {ButtonClick};
  124.  
  125.  
  126.   procedure TTTTControl4.ButtonClick(Sender: TObject);
  127.   var ButtonIndex: TPlace;
  128.   begin
  129.     for ButtonIndex := Low(ButtonIndex) to High(ButtonIndex) do
  130.       if Button[ButtonIndex] = Sender as TButton then
  131.         UserMove(ButtonIndex)
  132.   end {ButtonClick};
  133.  
  134.  
  135.   procedure TTTTControl4.ComputerMove;
  136.   var Move: TMove;
  137.   begin
  138.     if IsWinner(Game) = NoneID then
  139.     begin
  140.       Move := NextMove(Game,CompID);
  141.       if Move = 0 then
  142.       begin
  143.         FGameEnded := True;
  144.         MessageDlg('Neither has won, the game is a draw!', mtInformation, [mbOk], 0)
  145.       end
  146.       else
  147.       begin
  148.         MakeMove(Game,CompID,Move);
  149.         Button[Move].Caption := CompChar;
  150.         if IsWinner(Game) = CompID then
  151.           MessageDlg('I have won!', mtInformation, [mbOk], 0)
  152.       end
  153.     end
  154.   end {ComputerMove};
  155.  
  156.   procedure TTTTControl4.UserMove(Move: TPlace);
  157.   begin
  158.     if IsWinner(Game) <> NoneID then
  159.     begin
  160.       if IsWinner(Game) = UserID then
  161.         MessageDlg('You have already won!', mtInformation, [mbOk], 0)
  162.       else
  163.         MessageDlg('I have already won!', mtInformation, [mbOk], 0)
  164.     end
  165.     else
  166.     begin
  167.       if FGameEnded then
  168.         MessageDlg('The game already has ended!', mtInformation, [mbOk], 0)
  169.       else
  170.       begin
  171.         if GetValue(Game, Move) <> NoneID then
  172.           MessageDlg('This place is occupied!', mtWarning, [mbOk], 0)
  173.         else
  174.         begin
  175.           Button[Move].Caption := UserChar;
  176.           MakeMove(Game,UserID,Move);
  177.           if IsWinner(Game) = UserID then
  178.             MessageDlg('Congratulations, you have won!', mtInformation, [mbOk], 0)
  179.           else
  180.             ComputerMove
  181.         end
  182.       end
  183.     end
  184.   end {UserMove};
  185.  
  186.  
  187.   procedure TTTTControl4.SetUserChar(Value: Char);
  188.   begin
  189.     if Value = FCompChar then
  190.       MessageDlg('Character '+Value+' already in use by CompChar!', mtError, [mbOk], 0)
  191.     else FUserChar := Value
  192.   end {SetUserChar};
  193.  
  194.   procedure TTTTControl4.SetCompChar(Value: Char);
  195.   begin
  196.     if Value = FUserChar then
  197.       MessageDlg('Character '+Value+' already in use by UserChar!', mtError, [mbOk], 0)
  198.     else FCompChar := Value
  199.   end {SetCompChar};
  200.  
  201.  
  202.   procedure Register;
  203.   begin
  204.     RegisterComponents('Dr.Bob', [TTTTControl4])
  205.   end {Register};
  206. end.
  207.